/*
  在 Dart 里使用 JSON
  https://dart.cn/guides/json


  在 Dart 里使用 JSON
  许多移动或网页应用都使用 JSON 来处理类似与服务器交换数据的任务。本文将讨论如果使用 Dart 对 JSON 数据进行序列化和反序列化：即 Dart 对象与 JSON 数据之间的相互转换。

  需要用到的库
  下述的库和包可以用作于所有的 Dart 平台：

  dart:convert
  包含 JSON 数据和 UTF-8（JSON 数据需要的字符编码）的转换器。

  package:json_serializable
  一个易于使用的代码生成包。当你添加一些元注解以及使用该包提供的构建器时， Dart 编译器可以为你生成序列化和反序列化的代码。

  package:built_value
  一个强大的，可以作为 json_serializable 替代的 package。


  示例讲解

  dart:convert - 编解码JSON，UTF-8等
  dart:convert 库（API reference）提供 JSON 和 UTF-8 转换器，以及创建其他转换器。
  JSON 是一种用于表示结构化对象和集合的简单文本格式。 UTF-8 是一种常见的可变宽度编码，可以表示Unicode字符集中的每个字符。

  使用时，通过 import dart:convert 引入。


 */
import 'dart:convert';

class GameObj{
  int score = 0;
  bool overtime = false;
  String? special_guest;
}

/*
  编解码JSON
 使用 jsonDecode() 解码 JSON 编码的字符串为 Dart 对象：
 */
var jsonString = '''
[
  {"score": 40},
  {"score": 80}
]
''';

//使用 jsonEncode() 编码 Dart 对象为 JSON 格式的字符串：

var scores2 = [
  {'score': 40},
  {'score': 80},
  {'score': 100, 'overtime': true, 'special_guest': null}
];


void main(){
  var scores = jsonDecode(jsonString);
  if(scores is List){
    var firstScore = scores[0];
    if(firstScore is Map){
      print('第一对象 score = ${firstScore['score']}');//map
    }
  } else{
    print('解析结果 scores = $scores');
    //解析结果 scores = [{score: 40}, {score: 80}, {score: 100, overtime: true, special_guest: null}]
  }

  var jsonText = jsonEncode(scores2);
  print('jsonText = $jsonText');
  //jsonText = [{"score":40},{"score":80},{"score":100,"overtime":true,"special_guest":null}]


  //只有 int， double， String， bool, null, List, 或者 Map 类型对象可以直接编码成 JSON。 List 和 Map 对象进行递归编码。
  //
  // 不能直接编码的对象有两种方式对其编码。第一种方式是调用 jsonEncode() 时赋值第二个参数，这个参数是一个函数，
  // 该函数返回一个能够直接编码的对象第二种方式是省略第二个参数，着这种情况下编码器调用对象的 toJson() 方法。

}